/***
* 负责分发消息服务模块， 其实就是把外部收到的消息，转化成内部事件，也就是data->msg->event的解码过程，
* 然后再把事件投递至线程池的消息队列，有线程池调用其process 方法对事件进行处理，最终调用每个event的handler方法
* 来处理event，此时每个event handler需要subscribe该event后才会被调用到。
***/

#ifndef BRK_SERVICE_DISPATCH_EVENT_SERVICE_H_
#define BRK_SERVICE_DISPATCH_EVENT_SERVICE_H_

#include <map>
#include <vector>
#include <queue>
#include "event.h"
#include "eventtype.h"
#include "iEventHandler.h"
#include "threadpool/threadpool/thread_pool.h"
#include "NetworkInterface.h"

#include <functional>
#include <iostream>
#include <mutex>

class DispatchMsgService {
protected:
	DispatchMsgService();
public:
	
	virtual ~DispatchMsgService();

	virtual BOOL open();
	virtual void close();

	virtual void subscribe(u32 eid, iEventHandler* handler);
	virtual void unsubscribe(u32 eid, iEventHandler* handler);
	virtual i32 enqueue(iEvent* ev);//把事件投递到线程池中进行处理
	virtual iEvent* process(const iEvent* ev);//对具体的事件进行分发处理
	static void svc(void* argv);//线程池回调函数
	static DispatchMsgService* getInstance(); //单例

	// 将网络数据解析成事件
	iEvent* parseEvent(const char* message, u32 len, u32 eid);

	// 处理所有响应事件
	void handleAllResponseEvent(NetworkInterface* networkinterface);

	// 构造网络服务
	static void setNetworkInterface(NetworkInterface* NWIF) { NTIF_ = NWIF; }

protected:

	static NetworkInterface* NTIF_;
	thread_pool_t* tp;

	static DispatchMsgService* DMS_;

	typedef std::vector<iEventHandler*> T_EventHandlers;
	typedef std::map<u32, T_EventHandlers> T_EventHandlersMap;
	T_EventHandlersMap subscribers_;

	bool svr_exit_;//服务状态

	static std::queue<iEvent*>response_events_;   // 需要响应的事件
	static pthread_mutex_t queue_mutex_;
	static std::vector<iEvent*>process_events_;
};

#endif // !BRK_SERVICE_DISPATCH_EVENT_SERVICE_H_
